package com.gjzhao.fmmall.controller;

import com.github.wxpay.sdk.WXPayUtil;
import com.gjzhao.fmmall.constant.ConstantInfo;
import com.gjzhao.fmmall.constant.Constants;
import com.gjzhao.fmmall.service.OrdersService;
import com.gjzhao.fmmall.websocket.WebSocketServer;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description: 支付回调处理 Controller //todo 支付宝支付
 * @Author: gjzhao
 * @Date Created in 2022-01-18 12:19 上午
 */
@RestController
@RequestMapping("/pay")
@CrossOrigin
@Api(value = "处理支付回调", tags = "支付回调管理")
public class PayController extends BaseController {


    @Autowired
    private OrdersService ordersService;

    /**
     * 接口作用：微信支付完成后，微信支付平台会调用该接口，返回支付信息
     * 回调接口:当用户支付成功之后，微信支付平台就会请求这个接口，将支付状态的数据传递过来
     * 业务流程分析：
     *      - 1.当前端收到支付链接链接后，将其转化为支付二维码，用户支付完成后
     *      - 2.微信调用该接口，将支付结果回调给应用程序
     *          - 2.1 如果支付成功，更新订单状态为"待发货"
     *          - 2.2 使用websocket将微信支付结果及时告诉前端，进行成功跳转
     */
    @RequestMapping("/callback")
    @ApiOperation(value = "支付回调处理")
    public String paySuccess(HttpServletRequest request) throws Exception {

        logger.info("-----------开始处理支付回调----------");

        // 1.接收微信支付平台传递的数据（使用request的输入流接收）
        ServletInputStream is = request.getInputStream();
        byte[] bs = new byte[1024];
        int len = -1;
        StringBuilder builder = new StringBuilder();
        //读取流
        while ((len = is.read(bs)) != -1) {
            builder.append(new String(bs, 0, len));
        }
        String s = builder.toString();
        //使用帮助类: 将xml接口的字符串 -> 装换成map
        Map<String, String> map = WXPayUtil.xmlToMap(s);

        if (map != null && "success".equalsIgnoreCase(map.get(ConstantInfo.WX_PARAMS_RESULT_CODE))) {
            //支付成功
            //2.修改订单状态为“待发货/已支付”
            String orderId = map.get(ConstantInfo.WX_PARAMS_TRADE_NO);
            int updateResult = ordersService.updateOrderStatus(orderId, Constants.OrderStats.NOT_DELIVERED.getValue());

            logger.info("-----------订单编号:" + orderId + "支付完成，当前状态为：已发货。----------");

            //3.通过websocket连接，向前端推送消息：只要前端接收到该消息，就刷新支付成功页面
            WebSocketServer.sendMsg(orderId, "1");
            logger.info("-----------订单编号:" + orderId + "，已将消息推送到前端。----------");

            //4.封装响应给微信支付平台
            if (updateResult > 0) {
                HashMap<String, String> resp = new HashMap<>();
                resp.put("return_code", "success");
                resp.put("return_msg", "OK");
                resp.put("appid", map.get(ConstantInfo.WX_PARAMS_APP_ID));
                resp.put("result_code", "success");
                return WXPayUtil.mapToXml(resp);
            }
            logger.info("-------------已通知到微信支付平台订单，该笔订单状态已更新完成----------");
        }
        return null;
    }
}
